package thread;

public class Demo9 {
    static class Counter {
        // 此时加了两次锁
        // 第一次加锁能够加锁成功，此时第二次加锁不能成功，只能阻塞等待
        // 而只要第一把锁一旦解锁（也就是执行完第一个synchronized代码块），第二把锁就会加锁成功
        public synchronized void increase() {
            /*synchronized (this){
                //...
            }*/

            increase2();
        }

        public void increase2() {
            increase3();
        }

        public synchronized void increase3() {
            // ...
        }

        // 此时这种套娃模式也是两次加锁，同样会产生死锁
        // 但是注意 synchronized自己会处理同一个对象连续上锁的情况，所以其实是不会死锁的！
    }

    public static void main(String[] args) {
        Counter counter = new Counter();
        Thread t = new Thread() {
            @Override
            public void run() {
                counter.increase();
            }
        };
        t.start();
    }
}
